<?php
/**
 * Description of c2php
 *
 * @author 
 */
class c2php {
    private $con                = "";   //contiene la conexion a la base de datos
    private $transaccion   = "";  //almacena el numero de la transaccion
//    private $archivo           = ""; //Contendra el apuntador del archivo
    private $ultimoToken   = ""; //Almacena el ultimo token
    private $escribio          = false; //indica si ha escrito o no, es para saber si termina con ; o ono
    private $isPrintf           = false;    //Indica si esta en un printF
    private $cadena = "";               //almacena la cadena del printF antes de ser impresa
    private $coma = false;
    private $error = false;      //variable para identificar si ocurrio un error
    private $paraArchivo = ""; //Contendra toda la informacion que se traducira a PHP
    public $transaccionErrores = "";    //funcion para almacenar los errores
    public function recibePrograma($compilado,$fuente,$transaccion,$con){
        /*funcion para obtener todo el programa y realizar un traduccion a PHP de su contenido*/
//        echo "<pre>";
//        var_dump($compilado);
//        echo "</pre><br/>";
//        echo "<pre>";
//        var_dump($fuente);
//        echo "</pre><br/>";
        $this->con = $con;
        $this->transaccion = $transaccion;
        $compilado = explode(";", $compilado);
        $fuente = explode(";", $fuente);
        foreach ($compilado as $ind => $frase) {
            $this->traduceFrase($frase,$fuente[$ind]);
            $this->nuevaFrase();
        }
        $this->paraArchivo = str_replace("@", "\\", $this->paraArchivo);
//        echo $this->paraArchivo;
        eval($this->paraArchivo);
        return;
    } //fin public function recibePrograma($compilado,$fuente,$transaccion){
    private function traduceFrase($frase,$fuente){
        /*Funcion para iterar con cada uno de los tokens*/
        $frase = explode("$", $frase);
        $fuente = explode("$", $fuente);
        foreach ($frase as $ind => $tokens) {
            $this->analiza($tokens,$fuente[$ind]);
            $this->ultimoToken = $tokens;
        }
        if($this->ultimoToken != "operaAgrupaCorCie" && $this->ultimoToken != "" && $this->escribio) //complementa con ; todas las frases que se han terminado de traducir
            $this->escribir(";");
        return true;
    } //fin private function traduceFrase($frase,$fuente){
    private function analiza($token,$palabra){
        $palabra = str_replace("%c", "%s", $palabra);
        switch ($token){
            case 'tipoDato':    //no se hace nada por que no existen tipos de datos para PHP
                return true;
            case 'variable':
                    $this->escribir($palabra, "$");
                return true;
            default :
                $this->escribir($palabra, "");
                return;
        }
    } //fin private function analiza($token,$palabra){
    private function escribir($palabra,$complemento = null){
        $this->escribio = true;
        $this->paraArchivo = $this->paraArchivo.$complemento.$palabra;
        return true;
    }//fin private function escribir($palabra,$complemento){
    
    private function nuevaFrase(){
        /*Funcion para inicializar variables al momento de una nueva frase*/
        $this->isPrintf = false;
        $this->coma = false;
        $this->escribio = false;
        $this->cadena = "";
    } //fin private function nuevaFrase(){
    private function publicaError($error, $metodo, $palabra, $token =null) {
        /*Funcion para publicar los errores que se han presentado*/
        $this->error = true;
        $this->palabras = $this->palabras . "<span class='errorCompila'>" . $palabra . "</span>";
        $sql = "select errorMensaje from errores where errorCod = '$error'";
        $result = $this->con->consulta($sql);
        $result = $this->con->unaFila($result);
        //Si existe el mismo tipo de error lo elimina de la tabla temporal
        $sql = "delete from temporal where transaccion = '{$this->transaccionErrores}' and tempIndVar1 = '$error'";
        $this->con->consulta($sql);
        //Inserta el error en la temporal con la transaccion principal
        $sql = "insert into temporal (transaccion,tempIndVar1,tempIndVar2) values(";
        $sql .= "'{$this->transaccionErrores}','$error','errores')";
        $this->con->consulta($sql);
        $mensaje = "<div id='divMensajesCompila' class='tituloErrorCompila'>ERROR: " . $error . "  {$result["errorMensaje"]}</div>" . $metodo . " - " . $palabra . " - " . $token;
        $tmp = preg_replace("/\$/", " ", $this->palabras);
        $mensaje .= "<div id='divErrorToken'>$tmp</div>";
        echo $mensaje;
        return true;
    } //fin private function publicaError($error, $metodo, $palabra, $token =null) {
} //fin class c2php {

?>
